package com.dmg.sp.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.dmg.sp.dao.RoleMapper;
import com.dmg.sp.entity.Role;
import com.dmg.sp.service.RoleService;
import com.dmg.sp.vo.RoleAuthVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
@Slf4j
@Service
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleMapper roleMapper;

    /**
     * 获取所有角色
     * @return
     */
    @Override
    public List<Role> getRoleList() {
        return roleMapper.selectList(null);
    }

    /**
     * 添加角色
     * @param role
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void addRole(Role role) {
        //根据角色编码查询是否存在相同的角色
        if(getRoleByCode(role.getRoleCode())!=null){
            throw new RuntimeException("角色编码已存在");
        }
        roleMapper.insert(role);
    }

    /**
     * 修改角色
     * @param role
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void editRole(Role role) {
        Role bean=roleMapper.selectById(role.getId());
        if(bean==null){
            throw new RuntimeException("角色不存在");
        }
        Role item=getRoleByCode(role.getRoleCode());
        if(item!=null && !item.getRoleCode().equals(bean.getRoleCode())){
            //如果要修改的角色已存在,但是 不是当前角色的编码 那么抛出异常
            throw new RuntimeException("角色编码已存在");
        }
        roleMapper.updateById(role);
    }

    /**
     * 删除角色
     * @param id
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void deleteRole(Integer id) {
        //判断角色是否存在
        Role role=roleMapper.selectById(id);
        if(role==null){
            throw new RuntimeException("角色不存在");
        }
        if(role.getRoleCode().equals("admin")){
            throw new RuntimeException("管理员不能删除");
        }

        //删除角色关联的用户
        roleMapper.deleteUser(id);
        //删除角色关联的权限
        roleMapper.deleteAuth(id);
        //删除角色
        roleMapper.deleteById(id);
    }

    /**
     * 根据角色id 查看角色详情
     * @param id
     * @return
     */
    @Override
    public Role getRoleById(Integer id) {
        return roleMapper.selectById(id);
    }

    /**
     * 查看用户对应的角色
     * @param userId
     * @return
     */
    @Override
    public List<Role> getUserRole(Integer userId) {
        return roleMapper.getUserRole(userId);
    }

    /**
     * 为角色分配权限
     * @return
     */
    @Override
    public void setRoleAuth(RoleAuthVo vo) {
        //判断角色是否存在
        if(roleMapper.selectById(vo.getRoleId())==null){
            throw new RuntimeException("角色不存在");
        }
        if(CollectionUtils.isEmpty(vo.getMenuIds())){
            throw new RuntimeException("权限不能为空");
        }
        //先删除旧的角色权限
        roleMapper.deleteAuth(vo.getRoleId());
        //在添加新的角色权限
        roleMapper.addRoleAuth(vo.getRoleId(),vo.getMenuIds());
    }

    /**
     * 根据角色编码获取角色信息
     * @param code
     * @return
     */
    private Role getRoleByCode(String code){
        QueryWrapper<Role> queryWrapper=new QueryWrapper();
        queryWrapper.eq("role_code",code);
        Role role=roleMapper.selectOne(queryWrapper);
        return role;
    }
}
